﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Web.UI.WebControls;
using Classes.Conec;
using Classes.Model.Entidade;

namespace Classes.Model.Dao
{
    public class CategoriaDAO
    {
        private const String SQL_INSERT = "INSERT INTO CATEGORIA (DESCRICAO) VALUES (@DESCRICAO)";
        private const String SQL_UPDATE = "UPDATE CATEGORIA SET DESCRICAO = @NOVA_DESCRICAO WHERE (ID_CATEGORIA = @ID_NOVA)";
        private const String SQL_DELETE = "DELETE CATEGORIA WHERE ID_CATEGORIA = @ID";
        private const String SQL_SELECT_ID = "SELECT * FROM CATEGORIA WHERE ID_CATEGORIA = @ID";
        private const String SQL_SELECT = "SELECT ID_CATEGORIA, DESCRICAO FROM CATEGORIA";
        private static CategoriaDAO categoria;

        public static CategoriaDAO getInstance()
        {
            if(categoria == null)
            {
                categoria = new CategoriaDAO();
            }
            return categoria;
        }

        public CategoriaDAO()
        {

        }

        public String deletar(int id)
        {
            using (SqlConnection conn = Conectar.getConexao())
            {
                SqlCommand executar_comando = new SqlCommand(SQL_DELETE, conn);
                try
                {
                    conn.Open();
                    executar_comando.Parameters.AddWithValue("@ID", id);
                    executar_comando.ExecuteNonQuery();
                    return "Categoria deletada com sucesso !";
                }
                catch (Exception o)
                {
                    return "Erro ao excluir ! " + o.Message;
                }
            }
        }

        public String inserir(Entidade.CategoriaDTO categoria)
        {
            using (SqlConnection conn = Conectar.getConexao())
            {
                SqlCommand executar_comando = new SqlCommand(SQL_INSERT, conn);
                try
                {
                    conn.Open();
                    executar_comando.Parameters.AddWithValue("@descricao", categoria.Descricao);
                    executar_comando.ExecuteNonQuery();
                    return "Inclusão realizada com sucesso";
                }
                catch (Exception o)
                {
                    return "Erro na inclusão " + o.Message;
                }
            }
        }

        public String atualizar(Entidade.CategoriaDTO categoria)
        {
            using (SqlConnection conn = Conectar.getConexao())
            {
                SqlCommand executar_comando = new SqlCommand(SQL_UPDATE, conn);
                try
                {
                    conn.Open();
                    executar_comando.Parameters.Add("@NOVA_DESCRICAO", System.Data.SqlDbType.VarChar, 100).Value = categoria.Descricao;
                    executar_comando.Parameters.Add("@ID_NOVA", System.Data.SqlDbType.Int, 10).Value = categoria.Id_categoria;
                    executar_comando.ExecuteNonQuery();
                    return "Atualização realizada com sucesso";
                }
                catch (SqlException sq)
                {
                    return "Erro na atualização: " + sq.Message;
                }
                catch (Exception ex)
                {
                    return "Erro na atualização: " + ex.Message;
                }
            }
        }

        public List<Entidade.CategoriaDTO> select()
        {
            using (SqlConnection conn = Conectar.getConexao())
            {
                List<Entidade.CategoriaDTO> categorias = new List<Entidade.CategoriaDTO>();
                SqlCommand executar_comando = new SqlCommand(SQL_SELECT, conn);
                try
                {
                    conn.Open();
                    SqlDataReader reader = executar_comando.ExecuteReader();
                    while (reader.Read())
                    {
                        var nome = reader.GetValue(1);
                        var id = reader.GetValue(0);
                        Entidade.CategoriaDTO cat = new Entidade.CategoriaDTO(Convert.ToUInt16(id), Convert.ToString(nome));
                        categorias.Add(cat);
                        cat = null;
                        //categorias.Add(new Entidade.CategoriaDTO(reader.GetInt16(1),reader.GetString(2)));
                    }
                    reader.Close();
                    return categorias;
                }
                catch (Exception)
                {
                    return categorias;
                }
            }
        }

        public CategoriaDTO select(int id_cat)
        {
            using (SqlConnection conn = Conectar.getConexao())
            {
                CategoriaDTO cat = null;
                SqlCommand executar_comando = new SqlCommand(SQL_SELECT_ID, conn);
                try
                {
                    conn.Open();
                    executar_comando.Parameters.AddWithValue("@ID", id_cat);
                    SqlDataReader reader = executar_comando.ExecuteReader();
                    while (reader.Read())
                    {
                        var nome = reader.GetValue(1);
                        var id = reader.GetValue(0);
                        cat = new CategoriaDTO(Convert.ToUInt16(id), Convert.ToString(nome));
                    }
                    reader.Close();
                    return cat;
                }
                catch (Exception)
                {
                    return new CategoriaDTO();
                }
            }
        }
    }
}
